package com.softeem.iov.service.impl;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.softeem.iov.dto.R;
import com.softeem.iov.dto.ResponseCode;
import com.softeem.iov.entity.Admin;
import com.softeem.iov.mapper.AdminMapper;
import com.softeem.iov.service.IAdminService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.coyote.Response;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

/**
 * <p>
 * 管理员表 服务实现类
 * </p>
 *
 * @author softeem
 * @since 2023-09-19
 */
@Service
public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements IAdminService {


    @Override
    public R login(Admin admin) {
        //构建查询条件包装器
        QueryWrapper<Admin> query = Wrappers.query(Admin.class);
        query.eq("username", admin.getUsername());
        // 根据用户名查询用户信息
        Admin a = getBaseMapper().selectOne(query);
        if (Objects.isNull(a)) {
            return R.fail().setMsg("该用户不存在").setCode(ResponseCode.LOGIN_FAIL_ERR_USER);
        }
        //判断账号是否可用
        if(a.getStatus() != 0){
            return R.fail().setMsg("账号禁用").setCode(ResponseCode.LOGIN_FAIL_ACCOUNT_LOCK);
        }
        // 将数据库中的用户盐获取，组合提交参数的密码，再加密
        String pwd = admin.getPassword() + a.getSalt();
        pwd = SecureUtil.md5(pwd);
        if(!Objects.equals(pwd,a.getPassword())){
            return R.fail().setMsg("密码错误").setCode(ResponseCode.LOGIN_FAIL_ERR_PWD);
        }
        // 登录成功，传递用户到控制层
        return R.ok().setData(a);
    }

    @Override
    public R add(Admin admin) {
        //构建查询条件包装器
        QueryWrapper<Admin> query = Wrappers.query(Admin.class);
        query.eq("username", admin.getUsername());
        //检查该管理员是否存在
        boolean exists = exists(query);
        if (exists) {
            return R.fail().setMsg("该管理员已存在").setCode(ResponseCode.REG_USER_EXISTS);
        }
        //对提交的密码加密
//        生成一个随机字符串作为当前用户的随机盐（key）
        String salt = RandomUtil.randomString(8);
        //组合随机盐到密码形成新密码
        String pwd = admin.getPassword() + salt;
        //对新密码加密（md5）
        pwd = SecureUtil.md5(pwd);
        //使用加密+加盐的密码覆盖用户提交的密码
        admin.setPassword(pwd);
        //添加随机盐到对象中（向数据库存储）
        admin.setSalt(salt);
        //执行添加
        if (save(admin)) {
            return R.ok().setMsg("添加成功").setData(admin);
        }
        return R.fail().setMsg("添加失败");
    }

    @Override
    public R modify(Admin admin) {
        //根据id查询管理员
        Admin a = getById(admin.getId());
        if(Objects.isNull(a)){
            return R.fail().setMsg("管理员不存在");
        }
        //如果有密码修改的需求，则需要重新生成salt并加密
        if(Objects.nonNull(admin.getPassword())){
            String salt = RandomUtil.randomString(8);
            String pwd = SecureUtil.md5(admin.getPassword() + salt);
            admin.setPassword(pwd);
            admin.setSalt(salt);
        }
        boolean b = updateById(admin);
        if(!b){
            return R.fail().setMsg("修改失败");
        }
        //修改成功，返回修改成功之后的结果
        return R.ok().setMsg("修改成功").setData(getById(admin.getId()));
    }

    @Override
    public R queryAll(Integer page, Integer limit) {
        //创建分页信息对象
        IPage<Admin> pageInfo = new Page<>(page,limit);
        //执行分页查询
        List<Admin> list = list(pageInfo);
        //将查询结果集传入分页信息对象中
        pageInfo.setRecords(list);
        return R.ok().setData(pageInfo);
    }
}
